package xm.util
{
	import xm.util.vo.DateVO;

	/**
	 * @author winnie
	 */	
	public class DateUtil
	{
		
		/**
		 * @param format "ymd", "md", "d" 등 원하는 값만 넣는다.
		 * @param divideWord
		 * @return 
		 */		
		public static function todayToFormat( format : String = "ymd", divideWord:String="-" ):String
		{
			var date : Date = new Date();
			format = format.toLowerCase();
			
			return dateToFormat( ( format.indexOf("y") > -1 ) ? uint( date.getFullYear() ) : -1,
				( format.indexOf("m") > -1 ) ? Number( date.getMonth() ) : -1,
				( format.indexOf("d") > -1 ) ? Number( date.getDate() ) : -1,
				divideWord );
		}
		
		
		/**
		 * <br>값을 넣고싶지 않을경우 -1 로 넘김.</br> 
		 * @param year
		 * @param month ( 0~11 )
		 * @param date
		 * @param divideWord
		 * @return 
		 */		
		public static function dateToFormat( year : Number = -1, 
											 month : Number = -1, 
											 date : Number = -1,
											 divideWord:String="-" ):String
		{
			var returnStr : String = "";
			
			returnStr = ( year != -1 ) ? year.toString()+divideWord : "";
			returnStr += ( month != -1 ) ? month.toString()+divideWord : "";
			returnStr += ( date != -1 ) ? date.toString() : "";
			
			return returnStr;
		}
		
		
		/**
		 * @param y : 년도
		 * @param m : 월
		 * @return DateVO 리스트.
		 */		
		
		/**
		 * <br>요일순은 일,월,화,수,목,금,토</br>
		 * @param y : 년도
		 * @param m : 월
		 * @param containPrevDate : 1일 이전 남는칸을 채워 반환할지 여부
		 * @param containNextDate : 마지막일 이후 남는칸을 채워 반환할지 여부
		 * @return DateVO 리스트.
		 * 
		 */		
		public static function getDateListAt( y : uint, 
											  m : uint, 
											  containPrevDate : Boolean = false,
											  containNextDate : Boolean = false  ):Vector.<DateVO>
		{
			// 편의를 위해 월을 1 빼줌.
			var date : Date = new Date( y, m );
			var list : Vector.<DateVO> = new Vector.<DateVO>();
			var vo : DateVO;
			
			// 1~마지막 날까지 삽입
			var len:int = getLastDateAtMonth( m, y );
			for (var i:int = 0; i < len; i++) 
			{
				date.setDate( i+1 );
				vo = new DateVO( y, m, i+1, date.getDay() );
				list.push( vo );
			}
			
			var prevY : Number;
			var prevM : Number;
			// 1일 이전 남은 요일만큼 삽입.
			if( containPrevDate )
			{
				len = list[0].day;
				prevY = ( m > 0 ) ? y : y-1; // 1월이었으면 해가 바뀌므로 y-1
				prevM = ( m > 0 ) ? m-1 : 11; // 1월이었으면 12로 가야하므로..
				var prevMonthLastDate : uint = getLastDateAtMonth( prevM , prevY ); 
				for( i=0; i<len; i++ )
				{
					date.setFullYear( prevY, prevM, prevMonthLastDate-i );
					vo = new DateVO( prevY, prevM, date.getDate(), date.getDay() );
					list.unshift( vo );
				}
			}
			
			// 마지막날 이후 남은 요일만큼 삽입.
			if( containNextDate )
			{
				len = 6 - list[ list.length-1 ].day;
				prevY = ( m < 11 ) ? y : y+1;
				prevM = ( m < 11 ) ? m+1 : 0;
				for( i=0; i<len; i++ )
				{
					date.setFullYear( prevY, prevM, i+1 );
					vo = new DateVO( prevY, prevM, i+1, date.getDay() );
					list.push( vo );
				}
			}
			
			
			return list;
			
		}
		
		
		
		/**
		 * @param m : 원하는 달
		 * @param y : 2월 마지막 일을 위해, 윤달을 계산코자 년도를 넣는다. 
		 * @return 
		 */		
		public static function getLastDateAtMonth( m : uint, y : uint = -1 ):uint
		{
			switch( m )
			{
				case 0 : return 31;
				case 1 : return ( (y != -1) && ( !(y%4) && (y%100) || !(y%400) ) ) ? 29 : 28; // 윤달이면 29, 아니면 28
				case 2 : return 31;
				case 3 : return 30;
				case 4 : return 31;
				case 5 : return 30;
				case 6 : return 31;
				case 7 : return 31;
				case 8 : return 30;
				case 9 : return 31;
				case 10 : return 30;
				case 11 : return 31;
			}
			
			return 0;
		}
		
	}
}